package com.ycxy.sh.transaction.controller;


import com.alibaba.fastjson.JSONObject;
import com.ycxy.sh.transaction.dao.entity.*;
import com.ycxy.sh.transaction.mapper.*;
import com.ycxy.sh.transaction.service.*;
import com.ycxy.sh.transaction.util.KeyUtil;
import com.ycxy.sh.transaction.dao.vo.LayuiPageVo;
import com.ycxy.sh.transaction.dao.vo.PageVo;
import com.ycxy.sh.transaction.web.JsonResult;
import com.ycxy.sh.transaction.web.ServiceCode;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;

/**
 *
 * @author hlt
 * @since 2019-12-21
 */
@Slf4j
@Api(tags = "5.商品管理模块")
@Controller
public class CommodityController {
    @Autowired
    private CommodityService commodityService;
    @Autowired
    private CommimagesService commimagesService;
    @Autowired
    private LoginMapper loginMapper;
    @Autowired
    private CommodityimagesMapper commodityimagesMapper;
    @Autowired
    private CommoditySoldrecordService soldrecordService;
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Autowired
    private CollectMapper collectMapper;
    @Autowired
    private CommodityMapper commodityMapper;

    /**
     * 跳转到发布商品
     */
    @GetMapping("/user/relgoods")
    public String torelgoods(HttpSession session){
//        String userid = (String)session.getAttribute("userid");
//        if(userid==null){
//            return "redirect:/:";
//        }
        return "/user/product/relgoods";
    }

    /**
     * 跳转到修改商品
     *  --不能修改已删除、已完成的商品
     *  1、查询商品详情
     *  2、查询商品的其他图
     */
    @GetMapping("/user/editgoods/{commid}")
    public String toUpdateCommodity(@PathVariable Long commid, HttpSession session, ModelMap modelMap){
        /*String userid = (String)session.getAttribute("userid");
        if(userid==null){
            return "redirect:/:";
        }*/
        //根据id查询商品详情
        Commodity commodity= commodityService.LookCommodity(new Commodity().setCommodityId(commid));
        if(commodity.getCommodityStatus().equals(2) || commodity.getCommodityStatus().equals(4)){
            return "/error/404";//商品已被删除或已完成交易
        }
        String[] commons=commodity.getCommon().split("、");
        commodity.setCommon(commons[0]).setCommon2(commons[1]);
        modelMap.put("goods",commodity);
        modelMap.put("otherimg", commimagesService.LookGoodImages(commid));
        return "/user/product/changegoods";
    }

    /**
     * 修改商品
     * 1、修改商品信息
     * 2、修改商品的其他图的状态
     * 3、插入商品的其他图
     */
    @PostMapping("/changegoods/rel")
    @ResponseBody
    public String updateCommodity(@RequestBody Commodity commodity, HttpSession session){
        commodityService.updateCommodity(commodity,session);
        log.debug("修改商品成功");
        return "0";
    }

    /**
     * 发布商品
     * 1、插入商品信息
     * 2、插入商品其他图
     */
    @PostMapping("/relgoods/rel")
    @ResponseBody
    public String publishCommodity(@RequestBody Commodity commodity, HttpSession session){
        commodityService.publishCommodity(commodity,session);
        log.debug("发布商品成功");
        return "0";
    }

    /**
     * 上传视频和主图
     */
    @PostMapping("/relgoods/video")
    @ResponseBody
    public JSONObject uploadVideo(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException {
        JSONObject video = commodityService.uploadVideo(file);
        log.debug("上传成功");
        return video;
    }

    /**
     * 上传其他图片
     */
    @PostMapping(value="/relgoods/images")
    @ResponseBody
    public JSONObject uploadImages(@RequestParam(value = "file", required = false) MultipartFile[] file) throws IOException {
        JSONObject uploadImages = commodityService.uploadImages(file);
        log.debug("上传其他图片成功");
        return uploadImages;
    }

    /**
     * 商品详情
     * 根据商品id（commid）查询商品信息、用户昵称及头像
     * 用户可以查看正常的商品
     * 商品发布者和管理员可以查看
     * */
    @GetMapping("/product-detail/{commid}")
    public String commodityDetail(@PathVariable("commid") Long commid, ModelMap modelMap,HttpSession session){
        Long couserid = (Long) session.getAttribute("userid");

        //根据商品id和商品状态（Commstatus）查询商品
        Commodity commodity = commodityMapper.selectById(new Commodity().setCommodityId(commid).setCommodityStatus(1));
        int i = 0;
        if (commodity.getCommodityStatus().equals(1)){//如果商品正常
            i=1;
        }else if (!StringUtils.isEmpty(couserid)){//如果用户已登录
            Login login = loginMapper.userLogin(new Login().setUserId(couserid));
            /**商品为违规状态时：本人和管理员可查看*/
            if (commodity.getCommodityStatus().equals(0) && (commodity.getUserId().equals(couserid) || (login.getRoleId().equals(2) || login.getRoleId().equals(3)))){
                i=1;
                /**商品为待审核状态时：本人和管理员可查看*/
            }else if (commodity.getCommodityStatus().equals(3) && (commodity.getUserId().equals(couserid) || (login.getRoleId().equals(2) || login.getRoleId().equals(3)))){
                i=1;
                /**商品为已售出状态时：本人和管理员可查看*/
            }else if (commodity.getCommodityStatus().equals(4) && (commodity.getUserId().equals(couserid) || (login.getRoleId().equals(2) || login.getRoleId().equals(3)))){
                i=1;
            }
        }
        if(i==1){
            commodity.setOtherimg(commodityimagesMapper.selectGoodImages(commid));
            /**商品浏览量+1*/
            commodityMapper.updateCommodity(new Commodity().setCommodityId(commid).setPageView(1));
            modelMap.put("userinfo", userInfoMapper.selectPartInfo(commodity.getUserId()));
            modelMap.put("gddetail",commodity);
            //如果没有用户登录
            if (StringUtils.isEmpty(couserid)){
                modelMap.put("collectstatus",2);
            }else {
                Collect collect = collectMapper.selectStatus(new Collect().setCommodityId(commid).setCollectUserId(couserid));
                if(collect!=null){
                    if (collect.getCollectStatus() == 2){
                        modelMap.put("collectstatus",2);
                    }else {
                        modelMap.put("collectstatus",1);
                    }
                }else {
                    modelMap.put("collectstatus",2);
                }
            }
            return "/common/product-detail";
        }else{
            return "/error/404";
        }
    }

    /**
     * 搜索商品分页数据
     * 前端传入搜索的商品名（commname）
     * */
    @GetMapping("/product/search/number/{commname}")
    @ResponseBody
    public PageVo searchCommodityNumber(@PathVariable("commname") String commname){
        int count = commodityService.queryCommodityByNameCount(commname);
        return new PageVo(200,"查询成功",count);
    }

    /**
     * 搜索商品
     * 前端传入当前页数（nowPaging）、搜索的商品名（commname）
     * */
    @GetMapping("/product/search/{nowPaging}/{commname}")
    @ResponseBody
    public JsonResult<List<Commodity>> searchCommodity(@PathVariable("nowPaging") Integer page, @PathVariable("commname") String commname){
        List<Commodity> commodityList = commodityService.searchCommodity(page, commname);
        log.debug("商品搜索成功");
        return JsonResult.ok(commodityList);
    }

    /**
     * 首页分类展示商品 --> 按照分类查询商品
     * 前端传入商品类别（category）
     * */
    @ResponseBody
    @GetMapping("/index/product/{category}")
    public JsonResult<List<Commodity>> indexCommodity(@PathVariable("category") String category) {
        List<Commodity> commodities = commodityService.indexCommodity(category);
        log.debug("首页分类展示商品成功");
        return JsonResult.ok(commodities);
    }

    /**
     * 查询最新发布的8条商品
     * */
    @ResponseBody
    @GetMapping("/product/latest")
    public JsonResult latestCommodity() {
        List<Commodity> commodities = commodityService.latestCommodit();
        log.debug("查询最新发布的8条商品成功");
        return JsonResult.ok(commodities);
    }

    /**
     * 产品清单分页数据
     * 前端传入商品类别（category）、区域（area）
     * 最低价（minmoney）、最高价（maxmoney）
     * 后端根据session查出个人所在城市信息（City）
     * */
    @GetMapping("/list-number/{category}/{area}/{minmoney}/{maxmoney}")
    @ResponseBody
    public PageVo productListNumber(@PathVariable("category") String category, @PathVariable("area") String area,
                                    @PathVariable("minmoney") BigDecimal minmoney, @PathVariable("maxmoney") BigDecimal maxmoney,
                                    HttpSession session) {
        int productListNumber = commodityService.productListNumber(category, area, minmoney, maxmoney, session);
        log.debug("产品清单分页数据查询成功");
        return new PageVo(200,"查询成功",productListNumber);
    }

    /**
     * 产品清单界面
     * 前端传入商品类别（category）、当前页码（nowPaging）、区域（area）
     * 最低价（minmoney）、最高价（maxmoney）、价格升序降序（price：0.不排序 1.升序 2.降序）
     * 后端根据session查出个人本校信息（school）
     * */
    @GetMapping("/product-listing/{category}/{nowPaging}/{area}/{minmoney}/{maxmoney}/{price}")
    @ResponseBody
    public JsonResult productInventory(@PathVariable("category") String category, @PathVariable("nowPaging") Integer page,
                                     @PathVariable("area") String area, @PathVariable("minmoney") BigDecimal minmoney, @PathVariable("maxmoney") BigDecimal maxmoney,
                                     @PathVariable("price") Integer price, HttpSession session) {
        List<Commodity> commodityList = commodityService.productInventory(category, page, area, minmoney, maxmoney, price, session);
        log.debug("产品清单数据查询成功");
        return JsonResult.ok(commodityList);
    }

    /**
     * 分页展示个人各类商品信息
     *前端传入页码、分页数量
     *前端传入商品信息状态码（commstatus）-->全部:100，已审核:1，待审核:3，违规:0，已完成:4
     */
    @GetMapping("/user/commodity/{commstatus}")
    @ResponseBody
    public LayuiPageVo pageUserCommodity(@PathVariable("commstatus") Integer commstatus, int limit, int page, HttpSession session) {
        LayuiPageVo layuiPageVo = commodityService.pageUserCommodity(commstatus, limit, page, session);
        log.debug("分页展示个人各类商品信息成功");
        return layuiPageVo;
    }

    /**
     * 用户根据商品id修改商品信息
     * 前端传入商品id（commid）
     * 前端传入操作的商品状态（commstatus）-->删除:2  已完成:4
     * */
    @ResponseBody
    @GetMapping("/user/changecommstatus/{commid}/{commstatus}")
    public JsonResult ChangeCommdotityStatus(@PathVariable("commid") Long commid, @PathVariable("commstatus") Integer commstatus, HttpSession session) {
       commodityService.ChangeCommdotityStatus(commid, commstatus, session);
        log.debug("成功修改商品信息");
        return JsonResult.ok();
    }
}

